package com.example.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Topic:
 * TopicExchange 是比较复杂但是也比较灵活的一种路由策略，在 TopicExchange 中，Queue 通过 routingkey 绑定到 TopicExchange 上，
 * 当消息到达 TopicExchange 后，TopicExchange 根据消息的 routingkey 将消息路由到一个或者多个 Queue 上
 * */
@Configuration
public class TopicConfig {

    public static final String XIAOMI_QUEUE_NAME = "xiaomi_queue_name";
    public static final String IPHONE_QUEUE_NAME = "iphone_queue_name";
    public static final String HONGMI_QUEUE_NAME = "hongmi_queue_name";
    public static final String TOPIC_EXCHANGE_NAME = "topic_exchange_name";

    @Bean
    Queue xiaomiQueue() {
        return new Queue(XIAOMI_QUEUE_NAME, true, false, false);
    }

    @Bean
    Queue iphoneQueue() {
        return new Queue(IPHONE_QUEUE_NAME, true, false, false);
    }

    @Bean
    Queue hongmiQueue() {
        return new Queue(HONGMI_QUEUE_NAME, true, false, false);
    }

    /**
     * 定义一个直连交换机
     *
     * @return
     */
    @Bean
    TopicExchange topicExchange() {
        //1. 交换机的名称
        //2。交换机是否持久化
        //3. 如果没有与之绑定的队列，是否删除交换机
        return new TopicExchange(TOPIC_EXCHANGE_NAME, true, false);
    }

    /**
     * 这个定义是将交换机和队列绑定起来
     *
     * @return
     */
    @Bean
    Binding xiaomiBinding() {
        return BindingBuilder
            //设置绑定的队列
            //表示消息的 routingkey 凡是以 “xiaomi” 开头的，都将被路由到名称为 “xiaomi” 的 Queue 上，#为通配符
            .bind(xiaomiQueue()).to(topicExchange()).with("xiaomi.#");
    }

    @Bean
    Binding iphoneBinding() {
        return BindingBuilder
            //设置绑定的队列
            .bind(iphoneQueue()).to(topicExchange()).with("iphone.#");
    }

    @Bean
    Binding hongmiBinding() {
        return BindingBuilder
            //设置绑定的队列
            .bind(hongmiQueue()).to(topicExchange()).with("#.hongmi.#");
    }
}
